package com.zhang.aloneway_springboot.inteceptor;

import com.zhang.aloneway_springboot.pojo.User;
import org.apache.commons.lang.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

//登录拦截器
public class LoginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //让request对象去获取session
        HttpSession session = request.getSession();
        //从session身上获取到context上下文，再进一步获取到上下文的路径
        String contextPath = session.getServletContext().getContextPath();
        //需求认证页面--(即路径列表requireAuthPages：这里放的是要拦截哪些路径)--是个字符串数组--
        //现在只放了一个index
        String[] requireAuthPages = new String[]{"index"};

        //从request对象身上获取requestURI
        String uri = request.getRequestURI();
        //System.out.println("==uri=="+uri); //    /index
        //把原来uri中的contextPath+/ 这一部分去掉，只要后面的部分
        uri = StringUtils.remove(uri,contextPath+"/");

        //把这个uri换个名  叫page
        String page = uri;
        //System.out.println("==uri=="+page); //    index

        if(beginWith(page,requireAuthPages)){
            //从session中提取出user对象
            User user = (User) session.getAttribute("user");
            //user是否为null，
            if(user == null){
                //如果为空，说明还没登录，那就通过response对象重定向到登录页面
                response.sendRedirect("login");
                return false;//不放行
            }
        }//否则，说明session中存着这个user对象的信息呢，那就放行吧（比如，登录后不小心关闭了浏览器，这时由于session中还有user对象的信息
                                                    //那么，再输入localhost:8443/index，它不会被拦截到登录页面了，直接进去了 ）
        return true;
    }


    private boolean beginWith(String page,String[] requireAuthPages){
        //result默认是false，不拦截
        boolean result = false;
        //遍历存地址的这个requireAuthPages对象
        for(String requiredAutoPage : requireAuthPages){
            //判断获取到的uri处理后成的page，是否包含在requiredAutoPage这个总体数组中（目前就一个index）
            if(StringUtils.startsWith(page,requiredAutoPage)){
                //如果有，说明这个路径是以/index开头的，就说明这个page的路径需要被拦截
                result = true;
                break;
            }
        }
        return result;
    }

}
